package controlador;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Time;
import java.text.SimpleDateFormat;
import java.util.Enumeration;
import java.util.Locale;
import java.util.Vector;

import modelo.FraseDAO;
import modelo.JugadorDAO;

import vista.VentanaJugar;

public class ControladorVentanaJugar implements ActionListener {
	
	private VentanaJugar ventanaJugar;
	private Vector<String> vectorFrases;
	private Vector<ControladorVentanaJugar> frases;
	private String frase;
	private FraseDAO fraseDAO;
	ControladorVentanaJugar controlador;
	private int nivel;
	int oportunidades=8;
	private Vector<Integer> indices = new Vector<Integer>();
	private int indice;
	
	private int numeroJuegos;
	
	private JugadorDAO jugadorDAO;
	
	public ControladorVentanaJugar(int nivel) {
		super();
		ventanaJugar = new VentanaJugar();
		ventanaJugar.setVisible(true);
		ventanaJugar.addListener(this);
		fraseDAO = new FraseDAO();
		this.nivel=nivel;
		
		ventanaJugar.getCrono().reiniciarCronometro();
		
		frases = obtenerFrase();
		
		int aleatorio = generarAleatorio();
		controlador = frases.get(aleatorio);
		indices.add(aleatorio);
		
		ventanaJugar.actualizarFrase(controlador.separarFrase());
		
		ventanaJugar.getCrono().iniciarCronometro();
		
		numeroJuegos = 0;
		
		jugadorDAO = new JugadorDAO();
		
	}
	
	public ControladorVentanaJugar (String frase) {
		vectorFrases = new Vector<String>();
		for (int i = 0; i < frase.length(); i ++){
			if (frase.charAt(i) == ' ')
				vectorFrases.add("");
			else
				vectorFrases.add("_");
		}
		this.frase = frase.toLowerCase();
	}
	
	public Vector<ControladorVentanaJugar> obtenerFrase() {
		Vector<ControladorVentanaJugar> frases = new Vector<ControladorVentanaJugar>();
		vectorFrases = fraseDAO.leerFrase(nivel);
		String[] cantidad = (String[])vectorFrases.toArray(new String[vectorFrases.size()]);
		
		for ( int i = 0; i < cantidad.length; i ++ )
			frases.add( new ControladorVentanaJugar( cantidad[i] ) );
		
		return frases;
	}
	
	public String separarFrase() {
		String separada = "";
		for ( Enumeration noSeparada = vectorFrases.elements(); noSeparada.hasMoreElements(); )
			separada += noSeparada.nextElement()+" ";
		
		return separada;
	}
	
	public boolean buscarLetra( String letra) {
		boolean encontro = false;
		
		if ( letra.length() != 0 ){
			letra = ""+letra.toLowerCase().charAt(0);
			for ( int i = 0; i < frase.length() ; i ++ )
				if ( frase.charAt(i) == letra.charAt(0) ){
					vectorFrases.setElementAt(letra,i);
					encontro = true;
				}
		}
		return encontro;
	}
	
	public boolean buscarFrase( String palabra ) {
		boolean encontro = false;
		if ( frase.equals(palabra) )
			encontro = true;
		if ( encontro )
			for ( int j = 0; j < frase.length(); j ++ )
				vectorFrases.set(j, String.valueOf(frase.charAt(j)));
		return encontro;
	}
	
	public int generarAleatorio() {
		int numero = vectorFrases.size();
		return (int) (Math.random()*numero);
	}
	
	public int siguienteAleatorio() {
		int siguiente = generarAleatorio();
		while (indices.contains(siguiente))
			siguiente = generarAleatorio();
		return siguiente;
	}
	
	public void resultadoDelJuego() {
		numeroJuegos ++;
		if( numeroJuegos != frases.size() ){
	
			this.indice = siguienteAleatorio();
			controlador = frases.get(indice);
			indices.add(indice);
			
			this.oportunidades = 8;
			
			ventanaJugar.actualizarFrase(controlador.separarFrase());
		}
		else {
			ventanaJugar.cambioDeNivel();
			ventanaJugar.setVisible(false);
		}
	}
	
	public Time convertirHora(String horaString) {
		Time fechaFormatoTime = null;
		try {
			SimpleDateFormat sdf = new java.text.SimpleDateFormat("hh:mm:ss", new Locale("es", "ES"));
			fechaFormatoTime = new java.sql.Time(sdf.parse(horaString).getTime());
		} catch (Exception ex) {
			System.out.println("Error al obtener el formato de la fecha/hora: " + ex.getMessage());
		}
		return fechaFormatoTime;
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		String actionCommand = e.getActionCommand();
		if (actionCommand.equals("Ok")) {
			if (ventanaJugar.getLetra().equals("")) {
				ventanaJugar.mostrarMensaje("Introduce una letra");
			}
			else {
				if (controlador.buscarLetra(ventanaJugar.getLetra())) {
					ventanaJugar.actualizarFrase(controlador.separarFrase());
				}
				else {
					
					ventanaJugar.mostrandoHomero(oportunidades);
					oportunidades--;
					ventanaJugar.oportunidadesRestantes(String.valueOf(oportunidades));
					if (oportunidades == 0) {
						ventanaJugar.getCrono().detenerse();
						ventanaJugar.mostrarMensajePerdio();
						resultadoDelJuego();
						oportunidades=8;
						ventanaJugar.oportunidadesRestantes(String.valueOf(oportunidades));
						ventanaJugar.imagenInvisible();
					}
				}
			}
			if (!controlador.vectorFrases.contains("_")){
				ventanaJugar.actualizarFrase(controlador.separarFrase());
				ventanaJugar.getCrono().detenerse();
				ventanaJugar.mostrarMensaje("Felicidades has ganado :D");
				resultadoDelJuego();
				ventanaJugar.oportunidadesRestantes(String.valueOf(oportunidades));
				ventanaJugar.imagenInvisible();
				
				Time puntajeNuevo = convertirHora(ventanaJugar.getTiempo());
				Time puntajeViejo = jugadorDAO.elMayor(nivel);
				
				int vaPor=1;
				
				if (jugadorDAO.generaridJugador(nivel)==5)
					vaPor=2;
				
				if (jugadorDAO.generaridJugador(nivel)<5) {
					new ControladorRegistrarJugador(vaPor, nivel, 
							puntajeNuevo, puntajeViejo);
				}
				else if (jugadorDAO.generaridJugador(nivel)==5) {
					if (convertirHora(ventanaJugar.getTiempo()).compareTo(jugadorDAO.elMayor(nivel)) < 0) {
						new ControladorRegistrarJugador(vaPor, nivel, 
								puntajeNuevo, puntajeViejo);
					}
				}
				ventanaJugar.getCrono().reiniciarCronometro();
				ventanaJugar.getCrono().iniciarCronometro();
			}
			ventanaJugar.limpiarLetra();
			ventanaJugar.limpiarPalabra();
		}
		else if (actionCommand.equals("Buscala")) {
			if (controlador.buscarFrase(ventanaJugar.getPalabra())) {
				ventanaJugar.actualizarFrase(controlador.separarFrase());
				ventanaJugar.getCrono().detenerse();
				ventanaJugar.mostrarMensaje("Felicidades has ganado :D");
				resultadoDelJuego();
				ventanaJugar.imagenInvisible();
				
				Time puntajeNuevo = convertirHora(ventanaJugar.getTiempo());
				Time puntajeViejo = jugadorDAO.elMayor(nivel);
				
				int vaPor=1;
				
				if (jugadorDAO.generaridJugador(nivel)==5)
					vaPor=2;
				
				if (jugadorDAO.generaridJugador(nivel)<5) {
					new ControladorRegistrarJugador(vaPor, nivel, 
							puntajeNuevo, puntajeViejo);
				}
				else if (jugadorDAO.generaridJugador(nivel)==5) {
					if (convertirHora(ventanaJugar.getTiempo()).compareTo(jugadorDAO.elMayor(nivel)) < 0) {
						new ControladorRegistrarJugador(vaPor, nivel, 
								puntajeNuevo, puntajeViejo);
					}
				}
				ventanaJugar.getCrono().reiniciarCronometro();
				ventanaJugar.getCrono().iniciarCronometro();	
			}
			else {
				ventanaJugar.getCrono().detenerse();
				ventanaJugar.mostrarMensajePerdio();
				resultadoDelJuego();
				ventanaJugar.imagenInvisible();
				
				ventanaJugar.getCrono().reiniciarCronometro();
				ventanaJugar.getCrono().iniciarCronometro();
			}
			ventanaJugar.limpiarLetra();
			ventanaJugar.limpiarPalabra();
		}
		ventanaJugar.oportunidadesRestantes(String.valueOf(oportunidades));
	}

}
